// window.onload = function () {

//     function Dep() {
//         this.subs = []
//     }
//     Dep.prototype.addSubs = function (sub) {
//         this.subs.push()
//     }
//     Dep.prototype.notify = function () {
//         this.subs.forEach(sub => {
//             sub.update()
//         })
//     }
//     Dep.target = null

//     function Watcher(vm, exp, cb) {
//         this.cb = cb
//         this.vm = vm
//         this.exp = exp
//         this.value = this.get()
//     }

//     Watcher.prototype = {
//         update: function () {
//             console.log('通知订阅者');
//             this.run()
//         },
//         run: function () {
//             let value = this.vm.data[this.exp]
//             let oldValue = this.value
//             if(value!==oldValue){
//                 this.value = value
//             }
//         },
//         get: function () {
//             Dep.target = this
//             let value = this.vm.data[this.exp]  // 强制执行监听器里的get函数
//             console.log('start');
//             Dep.target = null
//             return value
//         }
//     }

//     //单个数据劫持
//     function defineReactive(obj, key, val) {
//         observable(val)
//         let dep = new Dep()
//         Object.defineProperty(obj, key, {
//             configurable: true,
//             enumerable: true,
//             writeable: true,
//             get() {
//                 if(Dep.target){
//                     console.log('get');

//                     dep.addSubs(Dep.target)
//                 }
//                 return val
//             },
//             set(nVal) {
//                 if(val === nVal){
//                     return
//                 }
//                 console.log('set');
//                 console.log(dep);
//                 val = nVal
//                 dep.notify()
//             }
//         })
//     }

//     //数据监听
//     function observable(obj) {
//         if (!obj || typeof obj !== 'object') {
//             return
//         }
//         Object.keys(obj).forEach(key => {
//             defineReactive(obj, key, obj[key])
//         })
//         return obj
//     }

//     //发布订阅
//     function Vue({data,methods,exp}) {
//         this._event = Object.create(null)
//         this.data = data
//         observable(data);
//         new Watcher(this, exp, function (value) {

//         });

//         return this
//     }
//     Vue.prototype.$on = function (event, fn) {
//         this._event[event] ? this._event[event].push(fn) : this._event[event] = [fn]
//     }
//     Vue.prototype.$emit = function (event, params) {
//         this._event[event].forEach(item => {
//             item(params)
//         })
//     }

//     const vm = new Vue({
//         data:{
//             aaa:1
//         },
//         methods:{
//             updateCount(){
//                 this.aaa = 2
//             }
//         },
//         exp:'aaa'
//     })
//     setTimeout(()=>{
//         vm.data.aaa = 2
//     },2000)

// };

window.onload = function () {
    // const debounce = function (fn, wait, first = true) {
    //     let timer = null
    //     let immediately = first || false
    //     return function (...args) {
    //         const context = this;
    //         if (immediately) {
    //             fn.apply(context,args)
    //             immediately = false
    //         }
    //         timer && clearTimeout(timer)
    //         timer = setTimeout(() => {
    //             fn.apply(context,args)
    //         }, wait)
    //     }
    // }

    // const throttle = function (fn,wait,immediately) {
    //     let cDate = Date.now()
    //     const cWait = wait

    //     return function (...args) {
    //         const nDate = Date.now()
    //         const context = this;
    //         if(nDate - cDate >= cWait){
    //             fn.call(context,...args)
    //             cDate = nDate
    //         }
    //     }
    // }

    // const throttle = function (fn, wait, immediately) {
    //     let timer = null

    //     return function (...args) {
    //         if(!timer){
    //             const context = this;
    //             timer = setTimeout(() => {
    //                 fn.call(context, ...args)
    //                 timer = null
    //             }, wait)
    //         }
    //     }

    // }
    // const body = document.getElementById('body-content')
    // const cFn = throttle(function (e) {
    //     console.log(e.target.innerText);
    // }, 1000)
    function Obj() {

    }

    // Obj.prototype.c = 1
    Object.defineProperty(Obj.prototype,'c',{
        enumerable:false,
        value:2
    })
    const obj = new Obj()
    console.log('c' in obj);
    for (const key in obj) {
        console.log(key);
    }

    // console.log(obj.propertyIsEnumerable('c'));
    // body.addEventListener('mousemove', cFn, false)

    // const statusObj = { status: "pending" };

    // function Npromise(params) {
    //     const statusObj = {};
    //     let fulfilledFn = function () { };
    //     let rejectedFn = function () { };
    //     function PromiseSet(excutor) {
    //         let _self = this;
    //         statusObj.status = "pending";
    //         _self.value = undefined;
    //         _self.reason = undefined;
    //         const resolve = function (res) {
    //             setTimeout(() => {
    //                 if (statusObj.status === "pending") {
    //                     _self.value = res;
    //                     statusObj.status = "fulfilled";
    //                 }
    //             });
    //         };
    //         const reject = function (rej) {
    //             setTimeout(() => {
    //                 if (statusObj.status === "pending") {
    //                     _self.reason = rej;
    //                     statusObj.status = "rejected";
    //                 }
    //             });
    //         };
    
    //         const defineReactive = function (obj, key, val) {
    //             Object.defineProperty(obj, key, {
    //                 configurable: true,
    //                 get() {
    //                     console.log(val);
    //                     return val;
    //                 },
    //                 set(nval) {
    //                     if (nval === "fulfilled") {
    //                         fulfilledFn(_self.value);
    //                     }
    
    //                     if (nval === "rejected") {
    //                         rejectedFn(_self.reason);
    //                     }
    //                     val = nval
    //                 },
    //             });
    //         };
    
    //         try {
    //             defineReactive(statusObj, 'status', statusObj['status'])
    //             excutor(resolve, reject);
    //         } catch (err) {
    //             reject(err);
    //         }
    //     }
    
    //     PromiseSet.prototype.then = function (onFulfilled) {
    //         fulfilledFn = onFulfilled.bind(this);
    //         return this
    //     };
    
    //     PromiseSet.prototype.catch = function (onRejected) {
    //         rejectedFn = onRejected.bind(this);
    //         return this
    //     };

    //     return new PromiseSet(params)
    // }


    // let promise = new PromiseSet(function (resolve, reject) {
    //     resolve(123);
    // })
    // promise.then((flag) => {
    //     console.log(flag);
    // });

    // let obj = { a: 1 };
    // obj.b = 2
    // Object.defineProperty(obj, 'c', {
    //     enumerable: false,
    //     writable: true,
    //     value: 3
    // })
    // Object.prototype.d = 4
    // console.log('for...in');

    // for (const key in obj) {
    //     console.log(key,obj[key]);
    // }
    // console.log('Object.keys');

    // Object.keys(obj).forEach(k=>{
    //     console.log(k,obj[k]);
    // })
    // console.log('Object.entries');

    // Object.entries(obj).forEach(([key,value])=>{
    //     console.log(key,value);
    // })

    // console.log('Object.getOwnPropertyNames');

    // Object.getOwnPropertyNames(obj).forEach(key=>{
    //     console.log(key,obj[key]);
    // })

    // const NpromiseAll = function name(params) {
    //     if (!Array.isArray(params)) return

    //     return new Npromise((resolve, reject) => {

    //         const countNum = function () {
    //             let num = 0;
    //             let argsList = [];
    //             return function (res,index) {
    //                 // argsList.push.apply(argsList,args)
    //                 argsList[index] = res
    //                 if(++num===params.length){
    //                     resolve([...argsList])
    //                 }
    //             }
    //         }
    //         const cFn = countNum()
    //         params.forEach((fn,index)=> {
    //             fn().then((res) => {
    //                 cFn(res,index)
    //             }).catch(reject)
    //         })
    //     })

    // }

    // const fn1 = ()=>{
    //     return new Npromise((resolve,reject)=>{
    //         setTimeout(()=>{
    //             resolve(1)
    //         },1000)
    //     })
    // }

    // const fn2 = ()=>{
    //     return new Npromise((resolve,reject)=>{
    //         setTimeout(()=>{
    //             resolve(2)

    //         },2000)
    //     })
    // }

    // const fn3 = ()=>{
    //     return new Npromise((resolve,reject)=>{
    //         setTimeout(()=>{
    //             resolve(3)
    //         },3000)
    //     })
    // }
    // NpromiseAll([fn2,fn1,fn3]).then(res=>{
    //     console.log(res);
    // })
};
